<template>
  <div class="container" :class="{ 'sign-up-mode': isSignUpMode }">
    <div class="forms-container">
      <div class="signin-signup">
        <a-form
          ref="loginForm"
          class="sign-in-form"
          :model="userInfo"
          layout="vertical"
          @submit="handleSubmitLogin"
        >
          <h2 class="title">登录</h2>
          <a-form-item
            field="userAccount"
            :rules="[{ required: true, message: '登录出错，请刷新重试' }]"
            :validate-trigger="['change', 'blur']"
            hide-label
          >
            <a-input v-model="userInfo.userAccount" placeholder="用户名：admin">
              <template #prefix>
                <icon-user :size="22" />
              </template>
            </a-input>
          </a-form-item>
          <a-form-item
            field="userPassword"
            :rules="[{ required: true, message: '密码不能为空' }]"
            :validate-trigger="['change', 'blur']"
            hide-label
          >
            <a-input-password
              v-model="userInfo.userPassword"
              placeholder="密码：12345678"
              allow-clear
            >
              <template #prefix>
                <icon-lock :size="22" />
              </template>
            </a-input-password>
          </a-form-item>
          <a-button
            type="primary"
            html-type="submit"
            class="btn"
            long
            :loading="loading"
          >
            登录
          </a-button>
          <p class="social-text">或者通过以下平台登录</p>
          <div class="social-media">
            <a href="#" class="social-icon">
              <icon-wechat />
            </a>
            <a href="#" class="social-icon">
              <icon-qq />
            </a>
            <a href="#" class="social-icon">
              <icon-alipay-circle />
            </a>
            <a href="#" class="social-icon">
              <icon-github />
            </a>
            <a href="#" class="social-icon">
              <icon-weibo-circle-fill />
            </a>
          </div>
        </a-form>
        <!--        注册表单-->
        <a-form
          ref="registerForm"
          class="sign-up-form"
          layout="vertical"
          :model="registerFormData"
          @submit="handleSubmitRegister"
        >
          <h2 class="title">注册</h2>
          <a-form-item
            field="userAccount"
            :rules="[
              { required: true, message: '请您输入用户账号' },
              { minLength: 4, message: '账号不能小于4位' },
            ]"
            :validate-trigger="['change', 'blur']"
            hide-label
          >
            <a-input
              v-model="registerFormData.userAccount"
              placeholder="请输入用户名"
            >
              <template #prefix>
                <icon-user />
              </template>
            </a-input>
          </a-form-item>
          <a-form-item
            field="userPassword"
            :rules="[
              { required: true, message: '密码不能为空' },
              { minLength: 8, message: '密码不能小于8位' },
            ]"
            :validate-trigger="['change', 'blur']"
            hide-label
          >
            <a-input-password
              v-model="registerFormData.userPassword"
              placeholder="请输入密码"
              allow-clear
            >
              <template #prefix>
                <icon-lock />
              </template>
            </a-input-password>
          </a-form-item>
          <a-form-item
            field="checkPassword"
            :rules="[
          { required: true, message: '确认密码不能为空' },
          { minLength: 8, message: '确认密码不能小于8位' },
          {
            validator: async (value: string,cb) => {
              if (value !== registerFormData.userPassword) {
                cb('两次密码不一致')
              }
             }
          }
        ]"
            :validate-trigger="['change', 'blur']"
            hide-label
          >
            <a-input-password
              v-model="registerFormData.checkPassword"
              placeholder="请再次输入密码"
              allow-clear
            >
              <template #prefix>
                <icon-lock />
              </template>
            </a-input-password>
          </a-form-item>
          <a-form-item>
            <a-space>
              <a-button
                type="primary"
                html-type="submit"
                long
                class="btn"
                :loading="loading"
                style="width: 180px"
              >
                注 册
              </a-button>
              <a-button
                class="btn"
                style="background-color: #e1e1e1; color: #484646; width: 180px"
                @click="$refs.registerForm.resetFields()"
                >重 置
              </a-button>
            </a-space>
          </a-form-item>
          <p class="social-text">或者通过以下平台注册</p>
          <div class="social-media">
            <a href="#" class="social-icon">
              <icon-wechat />
            </a>
            <a href="#" class="social-icon">
              <icon-qq />
            </a>
            <a href="#" class="social-icon">
              <icon-alipay-circle />
            </a>
            <a href="#" class="social-icon">
              <icon-github />
            </a>
            <a href="#" class="social-icon">
              <icon-weibo-circle-fill />
            </a>
          </div>
        </a-form>
      </div>
    </div>

    <div class="panels-container">
      <div class="panel left-panel">
        <div class="content">
          <h1 style="font-size: 2.6rem; margin-bottom: 1.5rem"
            >XXX通用管理系统</h1
          >
          <h3>新用户?</h3>
          <p>
            好兄弟,你来了,我们的网站就差你的加入了,点击下方注册按钮加入我们吧!!
          </p>
          <button
            id="sign-up-btn"
            class="btn transparent"
            @click="toggleMode()"
          >
            注册
          </button>
        </div>
        <img src="../../assets/images/log.svg" class="image" alt="" />
      </div>
      <div class="panel right-panel">
        <div class="content">
          <h1 style="font-size: 2.6rem; margin-bottom: 1.5rem"
            >XXX通用管理系统</h1
          >
          <h3>已经是我们自己人了吗?</h3>
          <p> 那好兄弟,你直接点击登录按钮,登录到我们这优秀的系统里!! </p>
          <button
            id="sign-in-btn"
            class="btn transparent"
            @click="toggleMode()"
          >
            登 录
          </button>
        </div>
        <img src="../../assets/images/register.svg" class="image" alt="" />
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
  import { reactive, ref } from 'vue';
  import { useStorage } from '@vueuse/core';
  import { UserControllerService } from '@/api/generated';
  import { FormInstance, Message } from '@arco-design/web-vue';
  import useLoading from '@/hooks/loading';
  import { ValidatedError } from '@arco-design/web-vue/es/form/interface';
  import type { LoginData } from '@/api/user';
  import { useUserStore } from '@/store';
  import { useRouter } from 'vue-router';

  const errorMessage = ref('');
  const userStore = useUserStore();
  const router = useRouter();
  const { loading, setLoading } = useLoading();
  const isSignUpMode = ref(false);
  const loginConfig = useStorage('login-config', {
    rememberPassword: true,
    userAccount: 'admin', // 演示默认值
    userPassword: '12345678', // demo default value
  });
  const userInfo = reactive({
    userAccount: loginConfig.value.userAccount,
    userPassword: loginConfig.value.userPassword,
  });
  const registerFormData = reactive({
    userAccount: '',
    userPassword: '12345678',
    checkPassword: '12345678',
  });
  const registerForm = ref<FormInstance>();
  const loginForm = ref<FormInstance>();

  // 定义一个通用方法来清空表单数据
  function resetForm(formData: any) {
    const keys = Object.keys(formData);
    // eslint-disable-next-line no-restricted-syntax
    for (const key of keys) {
      formData[key] = ''; // 将每个字段设置为空字符串
    }
  }

  const toggleMode = () => {
    isSignUpMode.value = !isSignUpMode.value;
    registerForm.value?.resetFields();
    loginForm.value?.resetFields();
  };

  const handleSubmitRegister = async () => {
    setLoading(true);
    try {
      const res = await UserControllerService.userRegisterUsingPost(
        registerFormData
      );
      if (res) {
        registerForm.value.resetFields();
        resetForm(registerFormData);
        Message.success('注册成功');
      }
    } finally {
      setLoading(false);
    }
  };

  const handleSubmitLogin = async ({
    errors,
    values,
  }: {
    errors: Record<string, ValidatedError> | undefined;
    values: Record<string, any>;
  }) => {
    if (loading.value) return;
    if (!errors) {
      setLoading(true);
      try {
        await userStore.login(values as LoginData);
        const { redirect, ...othersQuery } = router.currentRoute.value.query;
        router.push({
          name: (redirect as string) || 'Workplace',
          query: {
            ...othersQuery,
          },
        });
        Message.success('欢迎使用');
        const { rememberPassword } = loginConfig.value;
        const { userAccount, userPassword } = values;
        // 实际生产环境需要进行加密存储。
        // The actual production environment requires encrypted storage.
        loginConfig.value.userAccount = rememberPassword ? userAccount : '';
        loginConfig.value.userPassword = rememberPassword ? userPassword : '';
      } catch (err) {
        errorMessage.value = (err as Error).message;
      } finally {
        setLoading(false);
      }
    }
  };
</script>

<style scoped lang="less">
  //@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700;800&display=swap');

  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }

  body,
  input {
    font-family: 'Poppins', sans-serif;
  }

  .container {
    position: relative;
    width: 100%;
    background-color: #fff;
    min-height: 100vh;
    overflow: hidden;
  }

  .forms-container {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
  }

  .signin-signup {
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    left: 75%;
    width: 50%;
    transition: 1s 0.7s ease-in-out;
    display: grid;
    grid-template-columns: 1fr;
    z-index: 5;
  }

  form {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    padding: 0rem 5rem;
    transition: all 0.2s 0.7s;
    overflow: hidden;
    grid-column: 1 / 2;
    grid-row: 1 / 2;
  }

  form.sign-up-form {
    opacity: 0;
    z-index: 1;
  }

  form.sign-in-form {
    z-index: 2;
  }

  .title {
    font-size: 2.2rem;
    color: #444;
    margin-bottom: 10px;
  }

  .input-field,
  .arco-input-wrapper {
    max-width: 380px;
    width: 100%;
    background-color: #f0f0f0;
    height: 55px;
    border-radius: 55px;
    padding: 0 0.4rem;
    position: relative;
  }

  /deep/ .arco-form-item {
    margin-bottom: 20px;
  }

  /deep/ .arco-form-item.arco-form-item-error,
  .arco-form-item.arco-form-item-has-help {
    margin-bottom: 0;
  }

  .input-field {
    display: grid;
    grid-template-columns: 15% 85%;
  }

  .arco-form-item-content-wrapper {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    width: 100%;
  }

  /deep/ .arco-form-item-content-flex {
    display: flex;
    align-items: center;
    justify-content: center !important;
  }

  .arco-input-wrapper {
    border: none;
  }

  .arco-input-focus {
    outline: none;
    box-shadow: none; /* 如果使用box-shadow作为聚焦状态的视觉反馈，这里移除它 */
    border: none; /* 确保聚焦时也没有边框 */
  }

  /deep/ .arco-input-wrapper .arco-input-prefix {
    padding-left: 12px;
  }

  /deep/ .arco-input-wrapper .arco-input-suffix {
    padding-left: 12px;
    padding-right: 12px;
    font-size: 1.2rem;
  }

  /deep/ .arco-form-item-wrapper-col {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 100%;
    min-width: 0;
    min-height: 32px;
  }

  /deep/ .arco-form-item-message {
  }

  .arco-form-item-status-error
    .arco-input-wrapper:not(.arco-input-disabled).arco-input-focus,
  .arco-form-item-status-error
    .arco-textarea-wrapper:not(.arco-textarea-disabled).arco-textarea-focus {
    background-color: #f0f0f0;
  }

  .input-field i {
    text-align: center;
    line-height: 55px;
    color: #acacac;
    transition: 0.5s;
    font-size: 1.1rem;
  }

  .input-field input {
    background: none;
    outline: none;
    border: none;
    line-height: 1;
    font-weight: 600;
    font-size: 1.1rem;
    color: #333;
  }

  .input-field input::placeholder {
    color: #aaa;
    font-weight: 500;
  }

  .social-text {
    padding: 0.7rem 0;
    font-size: 1rem;
  }

  .social-media {
    display: flex;
    justify-content: center;
  }

  .social-icon {
    height: 46px;
    width: 46px;
    display: flex;
    justify-content: center;
    align-items: center;
    margin: 0 0.45rem;
    color: #333;
    border-radius: 50%;
    border: 1px solid #333;
    text-decoration: none;
    font-size: 1.6rem;
    transition: 0.3s;
  }

  .social-icon:hover {
    color: #4481eb;
    border-color: #4481eb;
  }

  .btn {
    width: 150px;
    background-color: #5995fd;
    border: none;
    outline: none;
    height: 49px;
    border-radius: 49px;
    color: #fff;
    text-transform: uppercase;
    font-weight: 600;
    margin: 10px 0;
    cursor: pointer;
    transition: 0.5s;
  }

  .btn:hover {
    background-color: #4d84e2;
  }

  .panels-container {
    position: absolute;
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
  }

  .container:before {
    content: '';
    position: absolute;
    height: 2000px;
    width: 2000px;
    top: -10%;
    right: 48%;
    transform: translateY(-50%);
    background-image: linear-gradient(-45deg, #4481eb 0%, #04befe 100%);
    transition: 1.8s ease-in-out;
    border-radius: 50%;
    z-index: 6;
  }

  .image {
    width: 100%;
    transition: transform 1.1s ease-in-out;
    transition-delay: 0.4s;
  }

  .panel {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    justify-content: space-around;
    text-align: center;
    z-index: 6;
  }

  .left-panel {
    pointer-events: all;
    padding: 3rem 17% 2rem 12%;
  }

  .right-panel {
    pointer-events: none;
    padding: 3rem 12% 2rem 17%;
  }

  .panel .content {
    color: #fff;
    transition: transform 0.9s ease-in-out;
    transition-delay: 0.6s;
  }

  .panel h3 {
    font-weight: 600;
    line-height: 1;
    font-size: 1.5rem;
  }

  .panel p {
    font-size: 0.95rem;
    padding: 0.7rem 0;
  }

  .btn.transparent {
    margin: 0;
    background: none;
    border: 2px solid #fff;
    width: 130px;
    height: 41px;
    font-weight: 600;
    font-size: 0.8rem;
  }

  .right-panel .image,
  .right-panel .content {
    transform: translateX(800px);
  }

  /* ANIMATION */

  .container.sign-up-mode:before {
    transform: translate(100%, -50%);
    right: 52%;
  }

  .container.sign-up-mode .left-panel .image,
  .container.sign-up-mode .left-panel .content {
    transform: translateX(-800px);
  }

  .container.sign-up-mode .signin-signup {
    left: 25%;
  }

  .container.sign-up-mode form.sign-up-form {
    opacity: 1;
    z-index: 2;
  }

  .container.sign-up-mode form.sign-in-form {
    opacity: 0;
    z-index: 1;
  }

  .container.sign-up-mode .right-panel .image,
  .container.sign-up-mode .right-panel .content {
    transform: translateX(0%);
  }

  .container.sign-up-mode .left-panel {
    pointer-events: none;
  }

  .container.sign-up-mode .right-panel {
    pointer-events: all;
  }

  @media (max-width: 870px) {
    .container {
      min-height: 800px;
      height: 100vh;
    }

    .signin-signup {
      width: 100%;
      top: 95%;
      transform: translate(-50%, -100%);
      transition: 1s 0.8s ease-in-out;
    }

    .signin-signup,
    .container.sign-up-mode .signin-signup {
      left: 50%;
    }

    .panels-container {
      grid-template-columns: 1fr;
      grid-template-rows: 1fr 2fr 1fr;
    }

    .panel {
      flex-direction: row;
      justify-content: space-around;
      align-items: center;
      padding: 2.5rem 8%;
      grid-column: 1 / 2;
    }

    .right-panel {
      grid-row: 3 / 4;
    }

    .left-panel {
      grid-row: 1 / 2;
    }

    .image {
      width: 200px;
      transition: transform 0.9s ease-in-out;
      transition-delay: 0.6s;
    }

    .panel .content {
      padding-right: 15%;
      transition: transform 0.9s ease-in-out;
      transition-delay: 0.8s;
    }

    .panel h3 {
      font-size: 1.2rem;
    }

    .panel p {
      font-size: 0.7rem;
      padding: 0.5rem 0;
    }

    .btn.transparent {
      width: 110px;
      height: 35px;
      font-size: 0.7rem;
    }

    .container:before {
      width: 1500px;
      height: 1500px;
      transform: translateX(-50%);
      left: 30%;
      bottom: 68%;
      right: initial;
      top: initial;
      transition: 2s ease-in-out;
    }

    .container.sign-up-mode:before {
      transform: translate(-50%, 100%);
      bottom: 32%;
      right: initial;
    }

    .container.sign-up-mode .left-panel .image,
    .container.sign-up-mode .left-panel .content {
      transform: translateY(-300px);
    }

    .container.sign-up-mode .right-panel .image,
    .container.sign-up-mode .right-panel .content {
      transform: translateY(0px);
    }

    .right-panel .image,
    .right-panel .content {
      transform: translateY(300px);
    }

    .container.sign-up-mode .signin-signup {
      top: 5%;
      transform: translate(-50%, 0);
    }
  }

  @media (max-width: 570px) {
    form {
      padding: 0 1.5rem;
    }

    .image {
      display: none;
    }

    .panel .content {
      padding: 0.5rem 1rem;
    }

    .container {
      padding: 1.5rem;
    }

    .container:before {
      bottom: 72%;
      left: 50%;
    }

    .container.sign-up-mode:before {
      bottom: 28%;
      left: 50%;
    }
  }
</style>
